<template>
    <a-input v-bind="getBindValue" v-model:value="showText" @input="backValue"></a-input>
</template>

<script lang="ts">
    import {defineComponent, PropType, ref, watchEffect, unref, watch} from 'vue';
    import {useAttrs} from '/@/hooks/core/useAttrs';
    import {propTypes} from '/@/utils/propTypes';
    import {JInputTypeEnum} from '/@/enums/jeecgEnum.ts';

    export default defineComponent({
        name: 'JInput',
        inheritAttrs: false,
        props: {
            value: propTypes.string.def(''),
            type: propTypes.string.def(JInputTypeEnum.JINPUT_QUERY_LIKE),
            placeholder: propTypes.string.def(''),
            trim: propTypes.bool.def(false),
        },
        emits: ['change','update:value'],
        setup(props, {emit}) {
            const attrs = useAttrs();
            //表单值
            const showText = ref('');
            //绑定属性
            const getBindValue = Object.assign({}, unref(props), unref(attrs));
            //监听类型变化
            watch(
                () => props.type,
                (val) => {
                    val && backValue({target: {value: unref(showText)}});
                }
            );
            //监听value变化
            watch(
                () => props.value,
                () => {
                    initVal();
                },
                {immediate: true}
            );

            /**
             * 初始化数值
             */
            function initVal() {
                if (!props.value) {
                    showText.value = ''
                } else {
                    let text = props.value;
                    switch (props.type) {
                        case JInputTypeEnum.JINPUT_QUERY_LIKE:
                            //修复路由传参的值传送到jinput框被前后各截取了一位 #1336
                            if (text.indexOf("*") != -1) {
                                text = text.substring(1, text.length - 1);
                            }
                            break;
                        case JInputTypeEnum.JINPUT_QUERY_NE:
                            text = text.substring(1);
                            break;
                        case JInputTypeEnum.JINPUT_QUERY_GE:
                            text = text.substring(2);
                            break;
                        case JInputTypeEnum.JINPUT_QUERY_LE:
                            text = text.substring(2);
                            break;
                        default:
                    }
                    showText.value = text
                }
            }

            /**
             * 返回值
             */
            function backValue(e) {
                let text = e?.target?.value??'';
                if (text && !!props.trim) {
                    text = text.trim()
                }
                switch (props.type) {
                    case JInputTypeEnum.JINPUT_QUERY_LIKE:
                        text = "*" + text + "*";
                        break;
                    case JInputTypeEnum.JINPUT_QUERY_NE:
                        text = "!" + text;
                        break;
                    case JInputTypeEnum.JINPUT_QUERY_GE:
                        text = ">=" + text;
                        break;
                    case JInputTypeEnum.JINPUT_QUERY_LE:
                        text = "<=" + text;
                        break;
                    default:
                }
                emit("change", text)
                emit("update:value", text)
            }

            return {showText, attrs, getBindValue, backValue};
        },
    });
</script>

<style scoped>

</style>
